package com.ssy.lingxi.pay.service;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.pay.api.model.vo.request.*;
import com.ssy.lingxi.pay.api.model.vo.response.CreditFeignDetailVO;
import com.ssy.lingxi.pay.api.model.vo.response.CreditPayResponseVO;
import com.ssy.lingxi.pay.model.vo.request.*;
import com.ssy.lingxi.pay.model.vo.response.*;

import javax.servlet.http.HttpServletRequest;

/**
 * 会员授信业务层
 *
 * @author 伍将
 * @version 2.0.0
 * @date 2020/8/12 19:22
 */
public interface ICreditService {
    /**
     * 初始化会员授信
     * @param initVO 接口参数
     * @return 初始化结果
     */
    Wrapper<Void> init(CreditInitVO initVO);

    /**
     * 查询会员授信
     * @param feignVO 上下级会员Id
     * @return 查询结果，如无授信，返回Null
     */
    Wrapper<CreditFeignDetailVO> findCredit(CreditFeignVO feignVO);

    /**
     * 新增授信
     * @param creditAddVO 接口参数
     * @return 新增结果
     */
    Wrapper<Void> add(CreditAddVO creditAddVO);

    /**
     * 分页获取会员授信
     * @param user 登录用户
     * @param pageVO 分页查询授信VO
     * @return 查询结果
     */
    Wrapper<PageData<CreditQueryVO>> pageCredit(UserLoginCacheDTO user, PageQueryCreditVO pageVO);

    /**
     * App端分页查询会员授信
     * @param user 登录用户
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<CreditQueryAppVO>> pageCreditByApp(UserLoginCacheDTO user, PageQueryCreditVO pageVO);

    /**
     * 分页获取子会员授信
     * @param user 登录用户
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<ChildCreditQueryVO>> pageChildCredit(UserLoginCacheDTO user, PageQueryChildCreditVO pageVO);

    /**
     * 更新会员授信状态
     * @param user 登录用户
     * @param memberCreditUpdateVO 接口参数
     * @return 记录Id
     */
    Wrapper<Long> updateCreditStatus(UserLoginCacheDTO user, CreditUpdateVO memberCreditUpdateVO);

    /**
     * 获取授信详情
     * @param user 登录用户
     * @param id 记录Id
     * @param isUpperSle 是否上级查询
     * @return 查询结果
     */
    Wrapper<CreditDetailVO> getDetail(UserLoginCacheDTO user, Long id, Boolean isUpperSle);

    /**
     * 授信支付
     * @param payVO 接口参数
     * @return 支付结果
     */
    Wrapper<CreditPayResponseVO> pay(CreditPayVO payVO);

    /**
     * 授信还款
     * @param user 登录用户
     * @param vo 接口参数
     * @param httpRequest Http请求
     * @return 还款结果
     */
    Wrapper<CreditRepayResultVO> repay(UserLoginCacheDTO user, CreditRepayVO vo, HttpServletRequest httpRequest);

    /**
     * 获取授信还款结果
     * @param user 登录用户
     * @param recordId 记录Id
     * @return 查询结果
     */
    Wrapper<CreditRepayResultVO> getCreditRepayResult(UserLoginCacheDTO user, Long recordId);

    /**
     * 确认还款成功
     * @param tradeCode 交易单号
     * @param orderCode 订单号
     */
    void confirmRepaySucceed(String tradeCode, String orderCode);

    /**
     * 确认还款
     * @param user 登录用户
     * @param vo 接口参数
     * @return 还款结果
     */
    Wrapper<Void> confirmRepay(UserLoginCacheDTO user, CreditConfirmRepayVO vo);

    /**
     * 退款
     * @param refundVO 接口参数
     * @return 退款交易号
     */
    Wrapper<String> refund(CreditRefundVO refundVO);

    /**
     * 采购商分页查询会员列表页面搜索条件内容
     * @param user 登录用户
     * @return 查询结果
     */
    Wrapper<CreditPageItemsVO> pageItemsByConsumer(UserLoginCacheDTO user);

    /**
     * 供应商商分页查询会员列表页面搜索条件内容
     * @param user 登录用户
     * @return 查询结果
     */
    Wrapper<CreditPageItemsVO> pageItemsBySupplier(UserLoginCacheDTO user);

    /**
     * 获取授信
     * @param user 登录用户
     * @param request 接口参数
     * @return 查询结果
     */
    Wrapper<CreditVO> getCredit(UserLoginCacheDTO user, CreditVORequest request);

    /**
     * 获取会员授信
     * @param user 登录用户
     * @param request 接口参数
     * @return 查询结果
     */
    Wrapper<CreditVO> getMemberCredit(UserLoginCacheDTO user, CreditRequestVO request);

    /**
     * 获取会员授信
     * @param request 接口参数
     * @return 查询结果
     */
    Wrapper<CreditVO> getCreditDetail(CreditRequestVO request);

    /**
     * 冻结授信
     * @param frozenCreditVO 接口参数
     * @return 冻结结果
     */
    Wrapper<Void> frozenCredit(FrozenCreditVO frozenCreditVO);

    /**
     * 获取可用余额
     * @param user 登录用户
     * @return 可用余额
     */
    Wrapper<Double> getCanUseQuota(UserLoginCacheDTO user);

    /**
     * 检查是否申请授信
     * @param user 登录用户
     * @return 检查结果
     */
    Wrapper<Boolean> existApplyCredit(UserLoginCacheDTO user);
}
